package com.eian.boot.crypto.config;

import com.eian.boot.crypto.constant.CryptoConstants;
import com.eian.boot.crypto.enums.CryptoAlgorithm;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.util.HashMap;
import java.util.Map;

/**
 * 加密配置属性
 *
 * @author eian
 */
@Data
@ConfigurationProperties(prefix = "eian.crypto")
public class CryptoProperties {

    /**
     * 是否启用加密组件
     */
    private boolean enabled = true;

    /**
     * 默认加密算法
     */
    private CryptoAlgorithm defaultAlgorithm = CryptoAlgorithm.AES_CBC;

    /**
     * 配置文件路径（支持外部化配置）
     */
    private String configFile = "config/crypto.yml";

    /**
     * 是否在启动时自动生成配置文件（如果不存在）
     */
    private boolean autoGenerateConfig = true;

    /**
     * AES 配置
     */
    private AesConfig aes = new AesConfig();

    /**
     * RSA 配置
     */
    private RsaConfig rsa = new RsaConfig();

    /**
     * SM4 配置（国密）
     */
    private Sm4Config sm4 = new Sm4Config();

    /**
     * SM2 配置（国密）
     */
    private Sm2Config sm2 = new Sm2Config();

    /**
     * 自定义密钥配置（键为算法名称，值为密钥信息）
     */
    private Map<String, String> keys = new HashMap<>();

    @Data
    public static class AesConfig {
        /**
         * 密钥（Base64编码）
         */
        private String key;

        /**
         * 密钥长度（128/192/256）
         */
        private int keySize = CryptoConstants.Defaults.AES_KEY_SIZE;

        /**
         * IV（Base64编码，可选）
         */
        private String iv;
    }

    @Data
    public static class RsaConfig {
        /**
         * 公钥（Base64编码）
         */
        private String publicKey;

        /**
         * 私钥（Base64编码）
         */
        private String privateKey;

        /**
         * 密钥长度（1024/2048/4096）
         */
        private int keySize = CryptoConstants.Defaults.RSA_KEY_SIZE;
    }

    @Data
    public static class Sm4Config {
        /**
         * 密钥（Base64编码）
         */
        private String key;

        /**
         * IV（Base64编码，可选）
         */
        private String iv;
    }

    @Data
    public static class Sm2Config {
        /**
         * 公钥（Base64编码）
         */
        private String publicKey;

        /**
         * 私钥（Base64编码）
         */
        private String privateKey;
    }
}

